#define _CRT_SECURE_NO_WARNINGS 1

//#define Max 10
//#include <stdio.h>
//
//extern int Add(int, int);
//
//int main()
//{
//	int a = Max;
//	int b = 20;
//	int c = Add(a, b);//Add函数，求两数之和
//	printf("%d\n", c);//打印结果
//	return 0;
//}




/*
		预处理指令

		2024年4月20日

		夏思成

		西科大15号公寓楼
*/


////写一个宏OFFSETOF，计算结构体中某变量相对于首地址的偏移，并给出说明
//#include <stdio.h>
//
////将0强制转化为结构体类型的指针，使得该结构体的起始地址为0
////后取出成员的地址，这时候成员的地址就是相对结构体起始位置的偏移量，再将其强制转换为size_t
//#define OFFSETOF(type,member) (size_t)&(((type*)0)->member)
//
//struct S
//{
//	char a;
//	int b;
//	float c;
//	double d;
//};
//
//int main()
//{
//	printf("成员a的偏移量 = %zd\n", OFFSETOF(struct S, a));
//	printf("成员b的偏移量 = %zd\n", OFFSETOF(struct S, b));
//	printf("成员c的偏移量 = %zd\n", OFFSETOF(struct S, c));
//	printf("成员d的偏移量 = %zd\n", OFFSETOF(struct S, d));
//	return 0;
//}


//写一个宏，可以将一个整数的二进制位的奇数位和偶数位交换。

//假设10
//二进制为：00000000 00000000 00000000 00001010-10
//取出奇数位，只需让偶数位为0即可。只需按位与上01010101 01010101 01010101 01010101该数，就可以取出奇数位
//取出偶数位，只需让奇数位位0即可。只需按位与上10101010 10101010 10101010 10101010该数，就可以取出偶数位
//奇数位左移一位，偶数位右移一位，后相加即可交换该整数的奇偶数位。
//结果为 00000000 00000000 00000000 00000101-5

#include <stdio.h>

#define SWAP(num) ((num&(0x55555555))<<1) + ((num&(0xaaaaaaaa))>>1)

int main()
{
	int n = 10;
	int ret = SWAP(n);
	printf("%d\n", ret);
	return 0;
}